O objetivo deste notebook é demonstrar como carregar, visualizar e manipular imagens para deixá-las prontas para o processamento.
Exemplificaremos as operações usando as duas bibliotecas mas comuns:
A biblioteca PIL, ou Python Image Processing traz para o Python a capacidade de processar imagens. A biblioteca suporta vários formatos de arquivo e poderosas ferramentas de processamento de imagem.
Alguns dos usos da biblioteca são Arquivamento, fazendo processamento em lote de imagens, Exibição, suportando várias interfaces (GUIs) e Processamento, como redimensionamento, rotação, histograma, dentre outras.
In [38]:
import numpy as np
from IPython.display import display
from PIL import Image
In [39]:
img = Image.open('../figures/versicolor.jpg')
In [40]:
type(img)
img.size, img.bits, img.format, img.mode
Out[40]:
In [41]:
img
Out[41]:
Ou também é possível usar o método display da classe IPython.display.
In [42]:
display(img)
In [43]:
r,g,b = img.split()
In [44]:
r
Out[44]:
In [45]:
g
Out[45]:
In [46]:
b
Out[46]:
In [47]:
img1 = Image.open('../figures/versicolor.jpg').convert('L')
img1
Out[47]:
In [48]:
img1.save('../figures/versicolor_BW.png','png')
In [49]:
numpy_img = np.array(img)
In [50]:
numpy_img.shape
Out[50]:
No caso acima, a imagem está representada no formato channels last. Existem duas formas principais de representar a imagem no array:
Dependendo das bibliotecas a serem usadas, às vezes precisamos trocar as dimensões e passar a informação de canais para a primeira posição. Esta configuração é conhecida como channels-first.
In [51]:
numpy_img.transpose(2,0,1).shape
Out[51]:
O Matplotlib é uma biblioteca para plotagem 2D. Com ela é possível plotar pontos, funções, estatísticas e imagens.
Nota: quando o Matplotlib é usando dentro do Jupyter-Notebook é necessário o uso do comando %matplotlib inline para que os gráficos sejam mostrados.
In [52]:
%matplotlib inline
import matplotlib.pyplot as plt
Note que para mostrar uma imagem com a biblioteca Matplotlib, esta já precisa estar carregada em um objeto.
A biblioteca Matplotlib consegue mostrar tanto imagens coloridas no formato PIL quando arrays NumPy no formato channels last.
In [53]:
plt.imshow(numpy_img)
Out[53]:
In [54]:
plt.imshow(img)
Out[54]:
In [55]:
plt.figure(figsize=(15, 10))
plt.title("Iris Versicolor")
plt.imshow(numpy_img)
plt.axis('off')
plt.show()
In [58]:
img2 = Image.open('../figures/versicolor_BW.png')
numpy_img2 = np.array(img2)
numpy_img2.shape
Out[58]:
Por padrão, o Matplotlib utiliza uma tabela de cor falsa (pseudo cor) quando visualiza uma imagem de um único canal. A função colorbar() mostra a tabela de cor utilizada:
In [59]:
plt.imshow(numpy_img2)
plt.colorbar();
Para visualizar a imagem en tons de cinza, deve-se informar a tabela gray, no parâmetro cmap do imshow.
In [60]:
plt.imshow(numpy_img2, cmap='gray')
plt.colorbar()
Out[60]:
In [91]:
import matplotlib.image as mpimg
f = mpimg.imread('../figures/versicolor_BW.png')
f.shape, f.dtype, f.min(), f.max()
Out[91]:
In [92]:
import matplotlib.image as mpimg
f = mpimg.imread('../figures/versicolor.jpg')
f.shape, f.dtype, f.min(), f.max()
Out[92]: